package com.tl.ip_location_relation_v4.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.tl.ip_location_relation_v4.entity.Ip;

public class IpUtil {
	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 将字符串的ip地址转换成一个long类型
	 */
	public static long ipToLong(String ip) {
		String[] ipArray = ip.split("\\.");
		return (Long.parseLong(ipArray[0]) << 24)
				+ (Long.parseLong(ipArray[1]) << 16)
				+ (Long.parseLong(ipArray[2]) << 8)
				+ (Long.parseLong(ipArray[3]));
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 将long类型的ip转换成字符串
	 */
	public static String longToIp(long ip) {
		StringBuffer sb = new StringBuffer();
		//  直接右移24位
		sb.append(String.valueOf((ip >>> 24)));
		sb.append(".");
		//  将高8位置0，然后右移16位
		sb.append(String.valueOf((ip & 0x00FFFFFF) >>> 16));
		sb.append(".");
		//  将高16位置0，然后右移8位
		sb.append(String.valueOf((ip & 0x0000FFFF) >>> 8));
		sb.append(".");
		//  将高24位置0
		sb.append(String.valueOf((ip & 0x000000FF)));
		return sb.toString();
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 将原始数据进行分割存储
	 */
	public static List<Ip> getIpList(List<String> dataList) {
		List<Ip> ipList = new ArrayList<Ip>();
		dataList.stream()
				.forEach(x -> {
					String[] temp = x.split("\t");
					// 进行校验
						if (temp.length != 3) {
							System.out.println("数据转换异常,请检查该行格式,内容--->" + x);
						}
						ipList.add(new Ip(ipToLong(temp[0]), ipToLong(temp[1]),
								temp[2]));
					});
		// 获取完数据后将dataList清空
		dataList.clear();
		return ipList;
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 校验ip地址格式是否正确
	 */
	public static boolean validateIp(String ip) {
		String regex = "\\b(([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\.){3}([01]?\\d?\\d|2[0-4]\\d|25[0-5])\\b";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(ip);
		return matcher.matches();
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 加载数据并转换 v1版本,使用了 FileInputUtilV1
	 */
	public static List<Ip> loadDataAndSwitchV1(String filePath, String charSet) {
		return getIpList(FileInputUtilV1.loadData(filePath, charSet));
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 加载数据并转换 v1版本,使用了 FileInputUtilV2
	 */
	public static List<Ip> loadDataAndSwitchV2(String filePath, String charSet) {
		return getIpList(FileInputUtilV2.loadData(filePath, charSet));
	}
}
